const rateLimit = require('express-rate-limit');

// 速率限制配置
const createRateLimiter = (windowMs = 15 * 60 * 1000, max = 100, message = '请求过于频繁，请稍后再试') => {
  return rateLimit({
    windowMs,
    max,
    message: { error: message },
    standardHeaders: true,
    legacyHeaders: false,
    handler: (req, res) => {
      res.status(429).json({
        error: message,
        retryAfter: Math.ceil(windowMs / 1000)
      });
    }
  });
};

// 不同接口的速率限制
const rateLimiters = {
  // 通用限制
  general: createRateLimiter(15 * 60 * 1000, 1000), // 15分钟1000次
  
  // 严格限制（登录、注册等）
  strict: createRateLimiter(15 * 60 * 1000, 5, '登录尝试过于频繁，请15分钟后再试'),
  
  // 上传限制
  upload: createRateLimiter(60 * 1000, 10, '上传过于频繁，请1分钟后再试'),
  
  // API限制
  api: createRateLimiter(1 * 60 * 1000, 60, 'API调用过于频繁，请1分钟后再试')
};

// 输入验证中间件
const validateInput = (req, res, next) => {
  // 检查常见的恶意输入
  const maliciousPatterns = [
    /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
    /javascript:/gi,
    /on\w+\s*=/gi,
    /eval\s*\(/gi,
    /expression\s*\(/gi
  ];
  
  const checkValue = (value) => {
    if (typeof value === 'string') {
      return maliciousPatterns.some(pattern => pattern.test(value));
    }
    if (typeof value === 'object' && value !== null) {
      return Object.values(value).some(checkValue);
    }
    return false;
  };
  
  if (checkValue(req.body) || checkValue(req.query) || checkValue(req.params)) {
    return res.status(400).json({ error: '检测到恶意输入' });
  }
  
  next();
};

module.exports = {
  rateLimiters,
  validateInput
};